package io.hilo.example.app.lifecycle;

import org.hilo.boot.core.spring.ApplicationReadyListener;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import io.hilo.example.component.CheckStateDemo;
import io.hilo.example.component.PrintStartInfo;

/**
 * 在spring bean 容器加载完成后做一些事情 
 * （执行顺序在<code>@PostConstruct</code>之后）
 * 
 * <p>spring和spring boot的生命周期很复杂，
 * ，为便于管理、减少误用，请统一使用下面的方法！！
 * 
 * <p>See {@link #onApplicationEvent}
 */
@Component
public class AppStartedListener extends ApplicationReadyListener {

    /**
     * 统一在此注册，从上到下依次执行，
     * 所有class实现 RunAfterStart接口为同步执行
     * ，实现 AsyncRunAfterStart接口为异步执行，
     * 同步执行时若有未捕获异常，则本次启动失败，应用退出
     */
    @Override
    protected void doInit(ApplicationContext ctx) {
        // doInit(ctx, CheckConfig.class); // 检查配置项是否正确
        doInit(ctx, CheckStateDemo.class); // 示例
        doInit(ctx, PrintStartInfo.class); // 示例
    }

    // redis mq
    // @Service
    // public static class RedisMessageSubscriber implements MessageListener {
    //
    // public void onMessage(Message message, byte[] pattern) {
    // OUT.log("---------onMessage....------------body={}, channle={}, pattern={}", message,
    // UT.Str.newString(message.getChannel()), UT.Str.newString(pattern));
    // }
    // }
    //
    // @Bean
    // RedisMessageListenerContainer myRedisMessageListenerContainer(
    // RedisConnectionFactory connectionFactory,
    // RedisMessageSubscriber r) {
    //
    // MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(r);
    //
    // RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    // container.setConnectionFactory(connectionFactory);
    // container.addMessageListener(listenerAdapter,
    // Arrays.asList(new ChannelTopic(AuthConstants.TOPIC_PERM_UPD),
    // new ChannelTopic(AuthConstants.TOPIC_USER_UPD)));
    // return container;
    // }

}
